﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Sispe.Entities;
using Sispe.BussinesLogic;
using Microsoft.Practices.Unity;
using System.Security.Cryptography;
using System.IO;

namespace Sispe.UI
{
    public partial class FrmMttoUsuario : Form
    {
        [Dependency]
        public IUsuarioBL usuarioBL { get; set; }

        [Dependency]
        public IRolBL rolBL { get; set; }

        [Dependency]
        public IPersonaBL personaBL { get; set; }

        [Dependency]
        public IMenuBL menuBL { get; set; }

        [Dependency]
        public IUsuarioMenuBL usuMenuBL { get; set; }

        public FrmMttoUsuario()
        {
            InitializeComponent();
            this.BuildUp();

            rOLBindingSource.DataSource = rolBL.GetAllFromRol();
        }

        List<MENU> _listMenusPorAsignar;

        bool isNew;

        public void Nuevo()
        {
            isNew = true;
            uSUARIOBindingSource.AddNew();
            gbDetalleUsuario.Enabled = false;
            contraseñaTextBox.ReadOnly = true;
            txtContraseña.ReadOnly = true;
        }

        public USUARIO _usuario { get; set; }
        public MENU currentMenu { get; set; }
        public USUARIO_MENU currentUsuarioMenu { get; set; }
        public ROL currentRol { get; set; }
        public int IdUsuario;

        public void Editar()
        {
            var usuario = usuarioBL.GetFromUsuarioByIdTrabajador(IdUsuario);
            isNew = false;
            //uSUARIOBindingSource.DataSource = _usuario;
            uSUARIOBindingSource.DataSource = usuario;
            uSUARIO_MENUBindingSource.DataSource = usuario.USUARIO_MENU;
            txtContraseña.Text = usuario.Contraseña;
            contraseñaTextBox.ReadOnly = true;
            txtContraseña.ReadOnly = true;
            nombreCompletoTextBox.ReadOnly = true;
            uSUARIOBindingSource.ResetBindings(true);
            uSUARIO_MENUBindingSource.ResetBindings(true);
        }

        private void FrmMttoUsuario_Load(object sender, EventArgs e)
        {
            mENUBindingSource.DataSource = menuBL.GetAllMenu();

            _listMenusPorAsignar = new List<MENU>();
        }

        private void cbRol_Click(object sender, EventArgs e)
        {
            rOLBindingSource.DataSource = rolBL.GetAllFromRol();
        }

        private void cbRol_SelectedValueChanged(object sender, EventArgs e)
        {
            if (cbRol.SelectedValue != null)
            {
                idRolTextBox.Text = cbRol.SelectedValue.ToString();
            }
        }

        private void btnTrabajador_Click(object sender, EventArgs e)
        {
            cargaTrabajador();
        }

        public void cargaTrabajador()
        {
            FrmTrabajador frm = new FrmTrabajador();
            frm.Extend();
            frm.ShowDialog();
            if (frm.currentTrabajador != null)
            {
                var nuevoTrabajador = personaBL.GetFromPersonaById(frm.currentTrabajador.Id);
                var usuario = uSUARIOBindingSource.Current as USUARIO;

                //inicializando los objetos de TRABAJADOR y PERSONA
                TRABAJADOR trab = new TRABAJADOR();
                PERSONA per = new PERSONA();
                usuario.TRABAJADOR = trab;
                usuario.TRABAJADOR.PERSONA = per;

                usuario.TRABAJADOR.PERSONA = nuevoTrabajador;
                usuario.TRABAJADOR.PERSONA.IdPersona = nuevoTrabajador.IdPersona;
                usuario.IdTrabajador = nuevoTrabajador.IdPersona;
                uSUARIOBindingSource.ResetBindings(true);
            }
        }

        public void verificarPassword()
        {
            if (contraseñaTextBox.Text == txtContraseña.Text && contraseñaTextBox.Text != "")
            {
                MessageBox.Show("Contraseña Correcta", "Mensaje", MessageBoxButtons.OK);
                gbDetalleUsuario.Enabled = true;
                mENUBindingSource.DataSource = menuBL.GetAllMenu();
            }
            else
                MessageBox.Show("Contraseña  no Coinciden", "Mensaje", MessageBoxButtons.OK);
        }

        private void txtContraseña_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                verificarPassword();
            }
        }

        private void contraseñaTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                txtContraseña.ReadOnly = false;
            }
        }

        private void dniTextBox_TextChanged(object sender, EventArgs e)
        {
            var _usuario = uSUARIOBindingSource.Current as USUARIO;
            var msg = "ERROR";
            if (_usuario != null)
            {
                try
                {
                    usuarioBL.VerificarAsignacion(_usuario);
                    MessageBox.Show("USUARIO LIBRE", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    contraseñaTextBox.ReadOnly = false;
                    txtContraseña.ReadOnly = true;
                }
                catch (Exception ex)
                {
                    msg = ex.Message;
                    var rpt = MessageBox.Show(msg, "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        var usu = usuarioBL.GetAllFromUsuarioByPersonaId(dniTextBox.Text);
                        var usuarioRol = uSUARIOBindingSource.Current as USUARIO;

                        if (usu != null)
                        {
                            usuarioRol.IdRol = usu.IdRol;
                            usuarioRol.Contraseña = _usuario.Contraseña;
                            txtContraseña.Text = _usuario.Contraseña;
                            gbDetalleUsuario.Enabled = true;

                            mENUBindingSource.DataSource = menuBL.GetAllMenu();

                            uSUARIOBindingSource.DataSource = _usuario;
                        }
                    }
                    else if (rpt == DialogResult.No)
                    {
                        this.Close();
                    }
                }
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            var usuarioMenu = uSUARIO_MENUBindingSource.Current as USUARIO_MENU;
            if (usuarioMenu != null)
            {
                if (usuarioMenu.Id > 0)
                {
                    usuMenuBL.deleteDetalle(usuarioMenu.Id, usuarioMenu.IdMenu);
                }

                var menu = _listMenusPorAsignar.Where(d => d.Id.Equals(usuarioMenu.IdMenu)).FirstOrDefault();
                var usuMenu = uSUARIO_MENUBindingSource.DataSource as List<USUARIO_MENU>;
                var usuario = uSUARIOBindingSource.Current as USUARIO;

                if (menu != null || usuario != null)
                {
                    uSUARIO_MENUBindingSource.ResetBindings(true);

                    uSUARIO_MENUBindingSource.RemoveCurrent();
                    _listMenusPorAsignar.Remove(menu);
                }
                else if (usuMenu != null && usuMenu.Count != 0)
                {
                    var usuarioMenuQuitar = usuMenu.Where(d => d.IdMenu.Equals(usuarioMenu.IdMenu)).FirstOrDefault();

                    uSUARIO_MENUBindingSource.RemoveCurrent();
                    uSUARIO_MENUBindingSource.ResetBindings(true);
                    usuMenu.Remove(usuarioMenuQuitar);
                }
                else
                {
                    MessageBox.Show("No hay datos seleccionados", "Mensaje", MessageBoxButtons.OK);
                }
            }
            else
            {
                MessageBox.Show("No hay datos seleccionados", "Mensaje", MessageBoxButtons.OK);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            var menu = mENUBindingSource.Current as MENU;
            var currentUsuario = uSUARIOBindingSource.Current as USUARIO;

            if (menu != null)
            {
                var detalle = new USUARIO_MENU
                {
                    IdUsuario = currentUsuario.TRABAJADOR.PERSONA.IdPersona,
                    IdMenu = menu.Id,
                    MENU = menu,
                    USUARIO = currentUsuario
                };

                var existe = currentUsuario.USUARIO_MENU.Where(dp => dp.MENU.Id.Equals(menu.Id)).SingleOrDefault();

                if (existe == null)
                {
                    currentUsuario.USUARIO_MENU.Add(detalle);
                }
                else
                {
                    MessageBox.Show(detalle.MENU.Descripcion + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                }

                _listMenusPorAsignar.Add(menu);
                uSUARIOBindingSource.ResetBindings(true);
                uSUARIO_MENUBindingSource.ResetBindings(true);
            }
        }

        private void btnAgregarTodos_Click(object sender, EventArgs e)
        {
            var listaMenuTodos = mENUBindingSource.DataSource as List<MENU>;
            var currentUsaurio = uSUARIOBindingSource.Current as USUARIO;

            if (listaMenuTodos != null)
            {
                foreach (var lista in listaMenuTodos)
                {
                    var detalle = new USUARIO_MENU
                    {
                        IdUsuario = currentUsaurio.TRABAJADOR.PERSONA.IdPersona,
                        IdMenu = lista.Id,
                        MENU = lista,
                        USUARIO = currentUsaurio
                    };

                    var existe = currentUsaurio.USUARIO_MENU.Where(dp => dp.MENU.Id.Equals(lista.Id)).SingleOrDefault();

                    if (existe == null)
                    {
                        currentUsaurio.USUARIO_MENU.Add(detalle);
                    }
                    else
                    {
                        MessageBox.Show(detalle.MENU.Descripcion + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                    }

                    _listMenusPorAsignar.Add(lista);
                    uSUARIOBindingSource.ResetBindings(true);
                    uSUARIO_MENUBindingSource.ResetBindings(true);
                }
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            _usuario = uSUARIOBindingSource.Current as USUARIO;
            currentMenu = mENUBindingSource.Current as MENU;
            currentRol = rOLBindingSource.Current as ROL;

            if (_usuario.Contraseña != null && _usuario.TRABAJADOR.PERSONA.Dni != null && _usuario.TRABAJADOR.PERSONA.NombreCompleto != null && currentRol.Id != 0 && _usuario.USUARIO_MENU.Count != 0)
            {
                if (isNew == true)
                {
                    FrmVerificarUsuarioMenu frm = new FrmVerificarUsuarioMenu();
                    frm.CurrentUsuario = _usuario;
                    frm.Nuevo();
                    frm.CurrentRol = currentRol;
                    frm.ShowDialog();
                    blokear();
                }
                else if (isNew == false)
                {
                    FrmVerificarUsuarioMenu frm = new FrmVerificarUsuarioMenu();
                    frm.CurrentUsuario = _usuario;
                    frm.Editar();
                    frm.CurrentRol = currentRol;
                    frm.ShowDialog();
                    blokear();
                }
            }
            else
                MessageBox.Show("Debe completar todos los campos", "Mensaje", MessageBoxButtons.OK);
        }

        public void blokear()
        {
            gbDatos.Enabled = false;
            gbDetalleUsuario.Enabled = false;
        }

        private void btnRol_Click(object sender, EventArgs e)
        {
            FrmMttoRol frm = new FrmMttoRol();
            frm.NuevoRol();
            frm.ShowDialog();
        }

        /*metodo para avanzar en la grilla*/
        public void Avanzar()
        {
            int[] listaMenu = new int[]{1005,1010,1015,1025,1030,4005,4020,5005,5055,
                                        2005,2010,2015,2020,2025,2030,2035,2040,2045,2050,2060,2065,2070,
                                        3005,3010,3015,3020,3025,3030,3035,3040,3045,3050,3055,3060,3065,3070,
                                        6005,6010,6015,7005,7015,7020,8005,8055,9005,9010,9015,9055,9060,10005,10010, 20000, 30000, 40000};      /*2005,2010,2015,2020,2025,2030,2035,2040,2045,2050,2060,2065,2070,
                                                     3005,3010,3015,3020,3025,3030,3035,3040,3045,3050,3055,3060,3065,3070,*/

            MENU currentMenu1 = mENUBindingSource.Current as MENU;

            if (currentMenu1.Tag == 1000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(1000);
            }
            else if (currentMenu1.Tag == 2000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(2000);
            }
            else if (currentMenu1.Tag == 3000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(3000);
            }
            else if (currentMenu1.Tag == 4000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(4000);
            }
            else if (currentMenu1.Tag == 5000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(5000);
            }
            else if (currentMenu1.Tag == 5050)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(5050);
            }
            else if (currentMenu1.Tag == 6000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(6000);
            }
            else if (currentMenu1.Tag == 7000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(7000);
            }
            else if (currentMenu1.Tag == 8000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(8000);
            }
            else if (currentMenu1.Tag == 8050)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(8050);
            }
            else if (currentMenu1.Tag == 9000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(9000);
            }
            else if (currentMenu1.Tag == 9050)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(9050);
            }
            else if (currentMenu1.Tag == 10000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(10000);
            }
            else
            {
                //mENUBindingSource.DataSource = menuBL.GetAllMenu();
                foreach (var lista in listaMenu)
                {
                    if (currentMenu1.Tag == lista)
                    {
                        mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTag(lista);
                    }
                //    else
                //    {
                //        mENUBindingSource.DataSource = menuBL.GetAllMenu();
                //    }
                }
            }
        }

        /*metodo para retroceder en la grilla*/
        public void Retroceder()
        {
            int[] listaMenu = new int[] {1006,1007,1008,1009,1011,1012,1013,1014,1016,
            1017,1018,1019,1026,1027,1028,1029,1031,1032,1033,
            1034,4006,4007,4008,4009,4010,4011,4012,4013, 4014,4015,4016,4021,
            4022,4023,4024,5006,5007,5008,5009,5056,6006,6007,6008,6009,6011,6012,6013,6014,
            6016,6017,6018,6019,7006,7007,7008,7009,7010,7011,7012,7016,7021,8006,8056,9006,9007,
            9008,9009,9011,9012,9013,9014,9016,9056,9057,9058,9059,9061,9062,9063,9064,
            10006,10007,10008,10009,10011,10012,10013,10014,
            2006,2007,2008,2009,2011,2012,2013,2014,
            2016,2017,2018,2019,2021,2022,2023,2024,2026,2027,2028,2029,2031,2032,2033,2034,
            2036,2037,2038,2039,2041,2042,2043,2044,2046,2047,2048,2049,2051,2052,2053,2054,
            2061,2062,2063,2064,2066,2067,2068,2069,2071,2072,2073,2074,3006,3007,3008,3009,
            3011,3012,3013,3014 ,3016,3017,3018,3019,3021,3022,3023,3024,3026,3027,3028,3029,
            3031, 3032,3033,3034,3036,3037,3038,3039,3041,3042,3043,3044,3046, 3047,3048, 3049,
            3051,3052,3053,3054,3056,3057,3058,3059,3061,3062,3063,3064,3066,3067,3068,3069,
            3071,3072,3073,3074, 20000, 30000, 40000};      /*2006,2007,2008,2009,2011,2012,2013,2014,
            2016,2017,2018,2019,2021,2022,2023,2024,2026,2027,2028,2029,2031,2032,2033,2034,
            2036,2037,2038,2039,2041,2042,2043,2044,2046,2047,2048,2049,2051,2052,2053,2054,
            2061,2062,2063,2064,2066,2067,2068,2069,2071,2072,2073,2074,3006,3007,3008,3009,
            3011,3012,3013,3014 ,3016,3017,3018,3019,3021,3022,3023,3024,3026,3027,3028,3029,
            3031, 3032,3033,3034,3036,3037,3038,3039,3041,3042,3043,3044,3046, 3047,3048, 3049,
            3051,3052,3053,3054,3056,3057,3058,3059,3061,3062,3063,3064,3066,3067,3068,3069,
            3071,3072,3073,3074,*/

            MENU currentMenu1 = mENUBindingSource.Current as MENU;
            
            if(currentMenu1.Tag>=1005 && currentMenu1.Tag<=2000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 2005 && currentMenu1.Tag <= 3000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 3005 && currentMenu1.Tag <= 4000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 4005 && currentMenu1.Tag <= 4030)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 5005 && currentMenu1.Tag <= 5020)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 5055 && currentMenu1.Tag <= 5090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 6005 && currentMenu1.Tag <= 6040)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 7005 && currentMenu1.Tag <= 7050)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 8005 && currentMenu1.Tag <= 8030)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 8055 && currentMenu1.Tag <= 8090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 9005 && currentMenu1.Tag <= 9030)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 9055 && currentMenu1.Tag <= 9090)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 10005 && currentMenu1.Tag <= 10020)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            if (currentMenu1.Tag >= 20000 && currentMenu1.Tag <= 40000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else
            {
                //mENUBindingSource.DataSource = menuBL.GetAllMenu();
                foreach (var lista in listaMenu)
                {
                    if (currentMenu1.Tag == lista)
                    {
                        mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(lista);
                    }
                //    else
                //    {
                //        mENUBindingSource.DataSource = menuBL.GetAllMenu();
                //    }
                }
            }
        }

        private void btnAvanzar_Click(object sender, EventArgs e)
        {
            Avanzar();
        }

        private void mENURadGridView_DoubleClick(object sender, EventArgs e)
        {
            Avanzar();
        }

        private void btnRetroceder_Click(object sender, EventArgs e)
        {
            Retroceder();
        }

    }
}
